/**
* <p>Title: DataHandlers.java</p>
* <p>Description: </p>
* <p>Company: www.huoyunren.com</p>
* @author duanxiangyun
* @date 2016年6月21日
* @version 1.0
*/
package com.duan.test.utils.Excel;


import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

public class DataHandlers {
	private static IExcelParser excelParser;
	public static IExcelParser getExcelParser() {
		return excelParser;
	}

	private DataHandlers() {
	}

	/**
	 * 初始化对象，加载excel
	 * @param filename 文件名
	 * @return excel对象
	 */
	public static DataHandlers getInstance(String filename) {
		DataHandlers handler = new DataHandlers();
		excelParser = DefaultExcelParser.createExcelParser(filename);
		return handler;	
	}
	/**
	 * 获得sheet对应全部数据
	 * @param sheetname 表名
	 * @return 二维数据的数据对象
	 * @throws Exception 
	 */
	public Object[][] getData(String sheetname) throws Exception {	
		return getData(sheetname, true);
	}
	/**
	 * 获得sheet对应数据,选择删除空数据
	 * @param sheetname 表名
	 * @param delEptRow 是否删除空数据
	 * @return 二维数据的数据对象
	 * @throws Exception 
	 */
	public Object[][] getData(String sheetname,Boolean delEptRow) throws Exception {			
		Workbook wb;
		Sheet sheet;
		Object[][] tempData = null;
		try {
			wb = excelParser.getWorkBook();
			if (null == wb) {
				tempData = null;
			}
			// get the first sheet
			sheet = excelParser.getSheet(wb, sheetname);
			if (null == sheet) {
				throw new Exception("Excel找不到对应sheet：" + sheetname);

			}
			tempData = convertSheet2Array(sheet,delEptRow);			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new Exception("Excel读取失败,请确认excel文件路径是否正确");

		}
		return tempData;
	}
	/**
	 * 获得sheet对应数据
	 * @param sheetname 表名
	 * @param startRow 从startRow行开始读取,如果去除空行,那么startRow为去除空行后的起始行
	 * @param getRows 取的行数,当getRows<0时自动获取getRows开始全部行
	 * @param startCol 从startCol列开始读取
	 * @param getCols 取的列数,当getCols<0时自动获取startRow开始全部列
	 * @param delEptRow 读取的时候是否忽视空行(忽视空行后其他行坐标会变化)
	 * @return 二维数据的数据对象
	 * @throws Exception 
	 */
	public Object[][] getData(String sheetname,int startRow,int getRows,int startCol, int getCols, Boolean delEptRow) throws Exception {			
			Workbook wb;
			Sheet sheet;
			Object[][] tempData = null;
			try {
				wb = excelParser.getWorkBook();
				if (null == wb) {
					tempData = null;
				}
				// get the first sheet
				sheet = excelParser.getSheet(wb, sheetname);
				if (null == sheet) {
					throw new Exception("Excel找不到对应sheet：" + sheetname);

				}
				tempData = convertSheet2Array(sheet, startRow, getRows, startCol, getCols, delEptRow);			
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				throw new Exception("Excel读取失败,请确认excel文件路径是否正确");

			}
			return tempData;
	}

	/**
	 * Description: convert sheet data.默认读取全部数据，去除空行
	 * @param sheet 表名
	 * @return Object[][] 对象数组 ;没有数据返回null
	 * @throws Exception 
	 */
	private static Object[][] convertSheet2Array(Sheet sheet,Boolean delEptRow) throws Exception {
		return convertSheet2Array(sheet, 0, -1,0,-1, delEptRow);
	}
	/**
	 * Description: convert sheet data.
	 * @param sheet 表名
	 * @param startRow 从startRow行开始读取,如果去除空行,那么startRow为去除空行后的起始行
	 * @param getRows 取的行数,当getRows<0时自动获取getRows开始全部行
	 * @param startCol 从startRow行开始读取
	 * @param getCols 取的列数,当getCols<0时自动获取startRow开始全部列
	 * @param delEptRow 读取的时候是否忽视空行(忽视空行后其他行坐标会变化)
	 * @return 二维数据的数据对象
	 * @throws Exception 
	 */
	private static Object[][] convertSheet2Array(Sheet sheet,int startRow,int getRows, int startCol, int getCols, Boolean delEptRow) throws Exception {
		if (delEptRow) {
			sheet = excelParser.deleteEptRows(sheet);
		}
		if (startRow < 0 || startCol < 0) {
			throw new Exception("起始行或列不能为负数");
		}
		int totalrows = sheet.getLastRowNum() + 1;
		int rows = totalrows - startRow;
		if (rows <= 0) {
			throw new Exception("起始行不能超过最大行数");

		}
		if (getRows > rows) {
			throw new Exception("取的行数超过了实际可以获得的行数");

		}
		int totalcols = getMaxColnum(startRow, totalrows, sheet);
		int cols = totalcols - startCol;
		if (cols <= 0) {
			throw new Exception("起始列不能超过最大列数");

		}
		if (getCols > cols) {
			throw new Exception("取的列数超过了实际可以获得的列数");

		}			
		if (getRows >= 0) {
			totalrows = startRow+getRows;
			rows = getRows;
		}
		if (getCols >= 0) {
			totalcols = startCol+getCols;
			cols = getCols;
		}	
		Object[][] datas = new Object[rows][cols];
		for (int i = startRow; i < totalrows; i++) {
			for (int j = startCol; j < totalcols; j++) {
				String value = excelParser.getCellValue(sheet, i, j);
				if (value == null) {
					value = "";
				}	
				datas[i - startRow][j - startCol] = value.trim();
			}
		}
		return datas;
	}
	/**
	 * 获取最大列数
	 * @param startrow
	 * @param totalrows
	 * @param sheet
	 * @return int
	 */
	public static int getMaxColnum (int startrow, int totalrows, Sheet sheet) {
		int num = 0;
		for (int i = startrow ; i < totalrows; i++) {
			Row r = sheet.getRow(i);
			if (r == null) {
				continue;
			}
			int tmpint = r.getLastCellNum();
			if (tmpint > num) {
				num = tmpint;
			}
		}
		return num;
	}
}
